﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using StyleMVVM.Data;
#if !DOT_NET
using Windows.Foundation;
using Windows.Foundation.Metadata;

#endif

namespace StyleMVVM.View.Regions
{
	public interface IRegion : INotifyPropertyChanged
	{
		IRegionManager RegionManager { get; set; }

		void Hook(object regionObject);

		void Unhook();

		string Name { get; }

		string Context { get; }

		string FullName { get; }

		string Home { get; set; }

		bool CanGoForward { get; }

		bool CanGoBack { get; }

		bool IsContainerMaster { get; set; }

		IEnumerable<object> GetCurrentExports();

#if NETFX_CORE
		IAsyncOperation<bool> GoForward();

		IAsyncOperation<bool> GoBack();

		IAsyncOperation<bool> GoHome();

		IAsyncOperation<bool> Navigate(string exportName);

		IAsyncOperation<bool> Navigate(string exportName, object navigationParameter);

		IAsyncOperation<bool> Activate(string exportName);

		IAsyncOperation<bool> Deactivate(string exportName);

		[DefaultOverload]
		IAsyncOperation<bool> Add(string exportName);

		IAsyncOperation<bool> Add(object export);

		[DefaultOverload]
		IAsyncOperation<bool> Add(string exportName, object navigationParameter);

		IAsyncOperation<bool> Add(object export, object navigationParameter);

		[DefaultOverload]
		IAsyncOperation<bool> Remove(string exportName);

		IAsyncOperation<bool> Remove(object export);
#else
		Task<bool> GoForward();

		Task<bool> GoBack();

		Task<bool> GoHome();

		Task<bool> Navigate(string exportName);

		Task<bool> Navigate(string exportName, object navigationParameter);

		Task<bool> Activate(string exportName);

		Task<bool> Deactivate(string exportName);

		[DefaultOverload]
		Task<bool> Add(string exportName);

		Task<bool> Add(object export);

		[DefaultOverload]
		Task<bool> Add(string exportName, object navigationParameter);

		Task<bool> Add(object export, object navigationParameter);

		[DefaultOverload]
		Task<bool> Remove(string exportName);

		Task<bool> Remove(object export);
#endif
	}
}